<?php
namespace app\com\simtoon\base;
use Yii;
use yii\data\ActiveDataProvider;
use yii\data\DataProviderInterface;
use yii\base\Arrayable;
use yii\base\Exception;
use app\com\simtoon\utils\ModelUtils;
use app\com\simtoon\log\LogUtils;
use yii\data\SqlDataProvider;

/**
 *	Model基类
 */
class BaseModel extends ModelUtils
{

    //2015-09-05 add by hetao: 添加呼叫中心号码
	//const CALL_NUM = "400-831-0909";  //呼叫中心号码
    //const THUMB_PATH = "http://211.159.163.106:8989";  //房源图片路径
    const JINGJIREN_IMG = "http://www.369fs.com:88/";



    //const ADS_URL = "http://www.fanghoo.cn/ads/mobile/info/";  //广告URL
    //const NEWS_URL = "http://www.fanghoo.cn/news/mobile/info/";//咨讯URL
	 //const GOODS_URL = "http://www.fanghoo.cn/goods/mobile/info/";//商品URL
	
    //const SITE_URL = "http://www.fanghoo.cn/";
    //const BRAND_URL = "http://www.fanghoo.cn/";
    //const NEWS_TITLE_IMG_URL = "http://www.fanghoo.cn/";

//    const BRAND_URL = "http://localhost:92/";
//   const NEWS_TITLE_IMG_URL = "http://localhost:92/";

//    const ADS_URL = "http://locahost:92/ads/mobile/info/";
//    const NEWS_URL = "http://locahost:92/news/mobile/info/";
//    const SITE_URL = "http://locahost:92/";




	/**
	 * 执行业务的查询方法
	 * @param $post http post请求
	 * @param $modelUtils  辅助类
	 */
	public function findData($post)
	{
		
	}
	
	/**
	 * 返回结果前回调
	 * @param  $result 查询结果
	 * @param $modelUtils  辅助类
	 */
	public function beforeOutput($results)
	{
		return $results;
	}
	
	
	public function findDataToArray($post)
	{
		try {
            //反射调用，适应自定义和默认方法
            $class = new \ReflectionClass($this);
            $method = $class->getMethod($post['method']);
            $res = $method->invokeArgs($class->newInstance(), array($post[0]));
            //2015-08-24 add by hetao: 增加是否回调beforeOutPut方法的判断
            $isCallBeforeOutPut = $post['isCallBeforeOutPut'];
            if($isCallBeforeOutPut == false){
                return $res;
            }
            if ($res instanceof SqlDataProvider)
            {
                $_models = $this->beforeOutput($res->getModels());
                $res->setModels($_models);
            }
            elseif ($res instanceof ActiveDataProvider)
            {
                $this->beforeOutput($res->getModels());
            }
            elseif ($res instanceof Arrayable)
            {
                $this->beforeOutput($res);
            }
            else
            {
                $this->beforeOutput($res);
            }
            return $res;
		} catch (Exception $e) {
			LogUtils::error($e->getMessage(), __METHOD__);
			return array();
		}
	}
	

	/**
	 * 执行insert、update、delete业务
	 * @param $post http post请求
	 * @param $modelUtils  辅助类
	 */
	public function executeData($post)
	{
	
	}
	
	public function executeDML($post)
	{
		try {
            $res = $this->executeData($post);
            return $res;
		} catch (Exception $e) {
			LogUtils::error($e->getMessage(), __METHOD__);
			return array();
		}
	}
	
	/**
	 * 拼接共同参数
	 */
	private function getCommonParam($data, $userId){
		$appKey = "";
		$appSecret = "";
		$timestamp = time() * 1000;
		// 签名加密
		$sign = MD5($appSecret . $appKey . $userId . $timestamp);
		// 初始化
		$param = array();
		$param["appkey"] = $appKey;
		$param["timestamp"] = $timestamp;
		$param["sign"] = $sign;
		if(empty($data)){
			return $param;
		}else{
			// 合并参数，返回
			return array_merge($data, $param);
		}
	}
	
	/**
	 * put访问酷家乐接口
	 */
	protected function putkjl($url,$data,$userId=''){
		$data = $this->getCommonParam($data,$userId);
		$url = 'http://www.kujiale.com' . $url;
		$first = true;
		foreach($data as $k=>$item){
			if($first){
				$url .= '?'.$k.'='.$item;
				$first = false;
			}else{
				$url .= '&'.$k.'='.$item;
			}
		}
	     $ch = curl_init(); //初始化CURL句柄 
	     curl_setopt($ch, CURLOPT_URL, $url); //设置请求的URL
	     curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); //设为TRUE把curl_exec()结果转化为字串，而不是直接输出 
	     curl_setopt($ch, CURLOPT_CUSTOMREQUEST,"PUT"); //设置请求方式
	     $output = curl_exec($ch);
	     curl_close($ch);
	    return $output;
	}
	
	/**
	 * delete访问酷家乐接口
	 */
	protected function deletekjl($url,$data,$userId=''){
		$data = $this->getCommonParam($data,$userId);
		$url = 'http://www.kujiale.com' . $url;
		$first = true;
		foreach($data as $k=>$item){
			if($first){
				$url .= '?'.$k.'='.$item;
				$first = false;
			}else{
				$url .= '&'.$k.'='.$item;
			}
		}
	     $ch = curl_init(); //初始化CURL句柄 
	     curl_setopt($ch, CURLOPT_URL, $url); //设置请求的URL
	     curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); //设为TRUE把curl_exec()结果转化为字串，而不是直接输出 
	     curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE'); //设置请求方式
	     $output = curl_exec($ch);
	     curl_close($ch);
	    return $output;
	}
	
	/**
	 * post访问酷家乐接口
	 */
	protected function postkjl($url,$data,$userId=''){
		$data = $this->getCommonParam($data,$userId);
		$url = 'http://www.kujiale.com' . $url;
		$ch = curl_init();
		curl_setopt($ch,CURLOPT_URL,$url);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //不验证证书
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); //不验证证书
		curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
		curl_setopt($ch,CURLOPT_POST,1);
		$a=curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
		$output = curl_exec($ch);
		curl_close($ch);
		return $output;
	}
	
	/**
	 * get访问酷家乐接口
	 */
	protected function getkjl($url,$data,$userId=''){
		$data = $this->getCommonParam($data,$userId);
		$url = 'http://www.kujiale.com' . $url;
		$first = true;
		foreach($data as $k=>$item){
			if($first){
				$url .= '?'.$k.'='.$item;
				$first = false;
			}else{
				$url .= '&'.$k.'='.$item;
			}
		}
		$ch = curl_init();
		//设置选项，包括URL
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //不验证证书
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); //不验证证书
		//执行并获取HTML文档内容
		$output = curl_exec($ch);
		//释放curl句柄
		curl_close($ch);
		return $output;
	}
	
	/**
	 * 融云签名
	 */
	protected function getRySign(){
		$appKey = '';
		$appSecret = ''; // 开发者平台分配的 App Secret。
	        // 重置随机数种子。
	        srand((double)microtime()*1000000);
	        $nonce = rand(); // 获取随机数。
	        $timestamp = time(); // 获取时间戳
	        $signature = sha1($appSecret.$nonce.$timestamp);
	        $data = array();
	        $data['App-Key'] = $appKey;
	        $data['Nonce'] = $nonce;
	        $data['Timestamp'] = $timestamp;
	        $data['Signature'] = $signature;
	        return $data;
	}
	
	/**
	 * post调用融云接口
	 */
	protected function postRy($url,$data){
		$sign = $this->getRySign();
		$header = array();
		$header[] = "Content-type: application/x-www-form-urlencoded";
		foreach($sign as $k=>$item){
			$header[] = $k.": ".$item;
		}
		$ch = curl_init();
		curl_setopt($ch,CURLOPT_URL,$url);
		curl_setopt($ch, CURLOPT_HTTPHEADER,$header);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //不验证证书
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); //不验证证书
		curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
		curl_setopt($ch,CURLOPT_POST,1);
		// post的变量  
		curl_setopt($ch, CURLOPT_POSTFIELDS,http_build_query($data));
		$output = curl_exec($ch);
		curl_close($ch);
		return $output;
	}
	
	/*array(
		array('id'=>,'dealline'=>''),
		array('id'=>,'dealline'=>''),
		array('id'=>,'dealline'=>''),
		array('id'=>,'dealline'=>''),
		array('id'=>,'dealline'=>''),
		);*/
	/**
	 * 获取存储位置
	 */
	protected function getSavePosition($ids,$divide,$storeId){
		// var_dump($ids);die;
		
		$result = array();
		if(empty($divide)){
			$divide = '';
		}
		// 循环货物ID
		foreach($ids as $item){
			// 计算货物存储位置
			$result[] = array('id'=>$item['id'],'dealline'=>$item['dealline'],'position'=>$this->getSingleSavePosition($item['id'], $item['dealline'],$divide,$storeId));
			// $result[] = array('id'=>$item['id'],''=>$item['dealline'],'position'=>$this->getSingleSavePosition($item['id'], $item['dealline'],$divide,$storeId));
		}
		// var_dump($result);die;
		return $result;
	}
	
	/**
	 * 获取单个货物存储位置
	 */
	private function getSingleSavePosition($id,$dealline,$divide,$storeId){
		// 查询当前货物对应的存储策略
		$sql = 'select d.*,t.id as tid,t.* from t_goods_infodetail d left join t_good_info g on d.fnumber = g.goodid left join t_sys_subpackage p on p.goodid = d.fnumber and d.sizenumber=p.boxid left join t_sys_type t on p.boxtype = t.id  where d.goodid = \'' . $id . '\' and d.dealline=\''. $dealline .'\' and t.fid=2';
		$product = $this->getCommand($sql)->queryOne();
		// var_dump($product);
		// 未找到产品或者产品没有对应的存储策略
		if(empty($product)){
			return '-1';
		}

		// 货架
		if($product['shelf'] == '1'){
			// var_dump($this->size);die;
			// 小件
			if($product['lightCase'] == 1 && $product['packageleng'] < $this->size && $product['packagewidth'] < $this->size && $product['packageheight'] < $this->size){
				// var_dump('expression');die;
				return $this->getSavePositionSmall($product,$divide,$storeId);
			}
			$sql = 'select * from t_sys_ware_position p where p.allHeight > 1 and p.wareType = 13 and ifnull(p.divide,"") = \''.$divide.'\' and userId = \''.$storeId.'\'  and varietiestype = \''.$product['tid'].'\'';
			$adp = new SqlDataProvider([
				'sql' => $sql
			]);
			// var_dump('2');
			// var_dump($sql);die;
			$adp=$adp->getModels();
			// var_dump($adp);die;
			// 当前代理商没有对应类型的仓库
			if(count($adp) == 0){
				return '-4';
			}
			switch($product['stack']){
				// 回型堆叠
				case '2':
					return $this->getSavePositionHui($product,$divide,$storeId);
					break;
				// 规则堆叠
				case '3':
					return $this->getSavePositionGui($product,$divide,$storeId);
					break;
				// 单层
				case '1':
					return $this->getSavePositionDan($product,$divide,$storeId);
					break;
				// 产品存储策略取值不正确
				default:
					return '-2';
					break;
			}
		}
		// 无货架
		else{
			// 小件
			if($product['lightCase'] == 1 && $product['goodlength'] < $this->size && $product['goodwidth'] < $this->size && $product['goodthick'] < $this->size){
				return $this->getSavePositionSmall($product,$divide,$storeId);
			}
			$sql = 'select * from t_sys_ware_position p where p.allHeight = 1 and p.wareType = 13 and ifnull(p.divide,"") = \''.$divide.'\' and userId = \''.$storeId.'\'  and varietiestype = \''.$product['tid'].'\'';
			$adp = new SqlDataProvider([
				'sql' => $sql
			]);
			// var_dump('1111');
			// echo($sql);die;
			$adp=$adp->getModels();
			// 当前代理商没有对应类型的仓库
			if(count($adp) == 0){
				return '-4';
			}
			switch($product['stack']){
				// 回型堆叠
				case '2':
					return $this->getSavePositionWuHui($product,$divide,$storeId);
					break;
				// 规则堆叠
				case '3':
					return $this->getSavePositionWuGui($product,$divide,$storeId);
					break;
				// 单层
				case '1':
					return $this->getSavePositionWuDan($product,$divide,$storeId);
					break;
				// 产品存储策略取值不正确
				default:
					return '-2';
					break;
			}
		}
		
	}
	
	// 小件尺寸(mm)
	private $size = 500;
	
	/**
	 * 货架回型堆叠
	 */
	private function getSavePositionHui($product,$divide,$storeId){
		// 计算占地面积
		if($product['packageleng'] >= $product['packagewidth'] && $product['packageheight'] >= $product['packagewidth']){
			$area = $product['packageleng']/1000 * $product['packageheight']/ 1000;
		}else if($product['packagewidth'] >= $product['packageleng'] && $product['packageheight'] >= $product['packageleng']){
			$area = $product['packagewidth']/1000 * $product['packageheight']/ 1000;
		}else{
			$area = $product['packagewidth']/1000 * $product['packageleng']/ 1000;
		}
		//////////////////////////////////////////////////////////////////////////////
		// 查询当前代理商仓位是否有对应货物
		//////////////////////////////////////////////////////////////////////////////
		$sql = 'select ifnull(t1.cnt,0) + ifnull(t2.cnt,0) as count,t1.* from ('
			. 'select p.*,count(*) as cnt from t_sys_ware_position p left join t_goods_infodetail d on p.id = d.locationid '
			. 'where p.allHeight > 1 and p.wareType = 13 and d.fnumber = \''.$product['fnumber']. '\' and d.sizenumber = \''.$product['sizenumber']. '\' and p.userId = \''.$storeId. '\' and ifnull(p.divide,"") = \''.$divide. '\' group by p.id) t1 '
			. 'left join (select locationid,count(*) as cnt from t_location_store where fnumber = \''.$product['fnumber']. '\' and sizenumber = \''.$product['sizenumber']. '\' group by locationid) t2';
		$adp = new SqlDataProvider([
			'sql' => $sql
		]);
		$adp=$adp->getModels();
		// 有对应货物
		if(!empty($adp) && count($adp) != 0){
			//////////////////////////////////////////////////////////////////////////////
			// 循环货物对应仓库
			//////////////////////////////////////////////////////////////////////////////
			foreach($adp as $item){
				// 当前仓位该货物数为奇数
				if($item['count']%2 == 1){
					// 临时表占位
					$this->execInsert('t_location_store',array('fnumber'=>$product['fnumber'],'sizenumber'=>$product['sizenumber'],'dealline'=>$product['dealline'],'goodid'=>$product['goodid'],'locationid'=>$adp[0]['id']));
					return $item['id'];
				}
				// 偶数
				else if($item['area'] * (1 - $product['marge']) < $item['resarea'] - $area){
					$sql = 'update t_sys_ware_position set resarea = resarea - ' . $area . ' where id = \''.$item['id'].'\'';
					$this->executeSql($sql);
					// 占位
					$this->execInsert('t_location_store',array('fnumber'=>$product['fnumber'],'sizenumber'=>$product['sizenumber'],'dealline'=>$product['dealline'],'goodid'=>$product['goodid'],'locationid'=>$adp[0]['id']));
					return $item['id'];
				}
			}
			//////////////////////////////////////////////////////////////////////////////
			// 当前代理商所有位置
			//////////////////////////////////////////////////////////////////////////////
			// 当前代理商所有能存放下该商品的仓位（取剩余面积最大）
			$sql = 'select * from t_sys_ware_position p where  p.userId = \''.$storeId.'\' and p.allHeight > 1 and p.wareType = 13 and ifnull(p.divide,"") = \''.$divide.'\' and varietiestype = \''.$product['tid'].'\' and area * (1 - '.$product['marge'].') < resarea - '.$area.' order by resarea desc';
			$adp = new SqlDataProvider([
				'sql' => $sql
			]);
			$adp=$adp->getModels();
			// 剩余位置最大
			if(count($adp) > 0){
				// 修改剩余面积
				$sql = 'update t_sys_ware_position set resarea = resarea - ' . $area . ' where id = \''.$adp[0]['id'].'\'';
				$this->executeSql($sql);
				// 占位
				$this->execInsert('t_location_store',array('fnumber'=>$product['fnumber'],'sizenumber'=>$product['sizenumber'],'dealline'=>$product['dealline'],'goodid'=>$product['goodid'],'locationid'=>$adp[0]['id']));
				return $adp[0]['id'];
			}
			//////////////////////////////////////////////////////////////////////////////
			// 就近
			//////////////////////////////////////////////////////////////////////////////
			$condition = array();
			// 循环已存放商品位置，取最近位置
			foreach($adp as $item){
				$condition[] = "'" . $item['wareId'] . "'";
			}
			$sql = 'select * from t_sys_ware_position p where p.userId = \''.$storeId.'\' and p.allHeight > 1 and p.wareType = 13 and varietiestype = \''.$product['tid'].'\' and area * (1 - '.$product['marge'].') < resarea - '.$area.' and wareId in (' . implode(',',$condition) . ') order by resarea desc';
			$adp = new SqlDataProvider([
				'sql' => $sql
			]);
			$adp=$adp->getModels();
			// 剩余位置最大
			if(count($adp) > 0){
				// 修改剩余面积
				$sql = 'update t_sys_ware_position set resarea = resarea - ' . $area . ' where id = \''.$adp[0]['id'].'\'';
				$this->executeSql($sql);
				// 占位
				$this->execInsert('t_location_store',array('fnumber'=>$product['fnumber'],'sizenumber'=>$product['sizenumber'],'dealline'=>$product['dealline'],'goodid'=>$product['goodid'],'locationid'=>$adp[0]['id']));
				return $adp[0]['id'];
			}
			//////////////////////////////////////////////////////////////////////////////
			// 同代理商、就近都未分配到位置，请手动分配位置
			//////////////////////////////////////////////////////////////////////////////
			return '-3';
		}
		//////////////////////////////////////////////////////////////////////////////
		// 第一次到的新品，查找当前代理商空余量最大的仓位
		//////////////////////////////////////////////////////////////////////////////
		$sql = 'select * from t_sys_ware_position p where p.userId = \''.$storeId.'\' and p.allHeight > 1 and p.wareType = 13 and ifnull(p.divide,"") = \''.$divide.'\' and varietiestype = \''.$product['tid'].'\' order by resarea desc';
		$adp = new SqlDataProvider([
			'sql' => $sql
		]);
		$adp=$adp->getModels();
		// 剩余位置最大
		if(count($adp) > 0 && $adp[0]['area'] * (1 - $product['marge']) < $adp[0]['resarea'] - $area){
			// 修改剩余面积
			$sql = 'update t_sys_ware_position set resarea = resarea - ' . $area . ' where id = \''.$adp[0]['id'].'\'';
			$this->executeSql($sql);
			// 占位
			$this->execInsert('t_location_store',array('fnumber'=>$product['fnumber'],'sizenumber'=>$product['sizenumber'],'dealline'=>$product['dealline'],'goodid'=>$product['goodid'],'locationid'=>$adp[0]['id']));
			return $adp[0]['id'];
		}
		//////////////////////////////////////////////////////////////////////////////
		// 代理商仓位存放不下
		//////////////////////////////////////////////////////////////////////////////
		else{
			$condition = array();
			// 循环已存放商品位置，取最近位置
			foreach($adp as $item){
				$condition[] = "'" . $item['wareId'] . "'";
			}
			$sql = 'select * from t_sys_ware_position p where p.userId = \''.$storeId.'\' and p.allHeight > 1 and p.wareType = 13 and varietiestype = \''.$product['tid'].'\' and area * (1 - '.$product['marge'].') < resarea - '.$area.' and wareId in (' . implode(',',$condition) . ') order by resarea desc';
			$adp = new SqlDataProvider([
				'sql' => $sql
			]);
			$adp=$adp->getModels();
			// 剩余位置最大
			if(count($adp) > 0){
				// 修改剩余面积
				$sql = 'update t_sys_ware_position set resarea = resarea - ' . $area . ' where id = \''.$adp[0]['id'].'\'';
				$this->executeSql($sql);
				// 占位
				$this->execInsert('t_location_store',array('fnumber'=>$product['fnumber'],'sizenumber'=>$product['sizenumber'],'dealline'=>$product['dealline'],'goodid'=>$product['goodid'],'locationid'=>$adp[0]['id']));
				return $adp[0]['id'];
			}
			//////////////////////////////////////////////////////////////////////////////
			// 同代理商、就近都未分配到位置，请手动分配位置
			//////////////////////////////////////////////////////////////////////////////
			return '-3';
		}
	}
	
	/**
	 * 货架规则堆叠
	 */
	private function getSavePositionGui($product,$divide,$storeId){
		//////////////////////////////////////////////////////////////////////////////
		// 查询当前代理商仓位是否有对应货物
		//////////////////////////////////////////////////////////////////////////////
		$sql = 'select p.* from t_sys_ware_position p left join t_goods_infodetail d on p.id = d.locationid '
			. 'where p.allHeight > 1 and p.wareType = 13 and d.fnumber = \''.$product['fnumber']. '\' and d.sizenumber = \''.$product['sizenumber']. '\' and p.userId = \''.$storeId. '\' and ifnull(p.divide,"") = \''.$divide. '\' ';
		$adp = new SqlDataProvider([
			'sql' => $sql
		]);
		$adp=$adp->getModels();
		// 有对应货物
		if(!empty($adp) && count($adp) != 0){
			//////////////////////////////////////////////////////////////////////////////
			// 循环货物对应仓库
			//////////////////////////////////////////////////////////////////////////////
			foreach($adp as $item){
				// 体积够存放
				if($item['volume'] * (1 - $product['marge']) < $item['resvolume'] -  $product['volume']){
					// 修改剩余体积
					$sql = 'update t_sys_ware_position set resvolume = resvolume - ' . $product['volume'] . ' where id = \''.$item['id'].'\'';
					$this->executeSql($sql);
					return $item['id'];
				}
			}
			//////////////////////////////////////////////////////////////////////////////
			// 当前代理商所有位置
			//////////////////////////////////////////////////////////////////////////////
			// 当前代理商所有能存放下该商品的仓位（取剩余面积最大）
			$sql = 'select * from t_sys_ware_position p where p.userId = \''.$storeId.'\' and p.allHeight > 1 and p.wareType = 13 and ifnull(p.divide,"") = \''.$divide.'\' and varietiestype = \''.$product['tid'].'\' order by resvolume desc';
			$adp = new SqlDataProvider([
				'sql' => $sql
			]);
			$adp=$adp->getModels();
			// 剩余位置最大
			if(count($adp) > 0){
				foreach($adp as $item){
					if($item['volume'] * (1 - $product['marge']) < $item['resvolume'] - $product['volume']){
						// 修改剩余体积
						$sql = 'update t_sys_ware_position set resvolume = resvolume - ' . $product['volume'] . ' where id = \''.$item['id'].'\'';
						$this->executeSql($sql);
						return $item['id'];
					}
				}
			}
			//////////////////////////////////////////////////////////////////////////////
			// 就近
			//////////////////////////////////////////////////////////////////////////////
			$condition = array();
			// 循环已存放商品位置，取最近位置
			foreach($adp as $item){
				$condition[] = "'" . $item['wareId'] . "'";
			}
			$sql = 'select * from t_sys_ware_position p where p.userId = \''.$storeId.'\' and p.allHeight > 1 and p.wareType = 13 and varietiestype = \''.$product['tid'].'\' and volume * (1 - '.$product['marge'].') < resvolume - '.$product['volume'].' and wareId in (' . implode(',',$condition) . ') order by resvolume desc';
			$adp = new SqlDataProvider([
				'sql' => $sql
			]);
			$adp=$adp->getModels();
			// 剩余位置最大
			if(count($adp) > 0){
				// 修改剩余体积
				$sql = 'update t_sys_ware_position set resvolume = resvolume - ' . $product['volume'] . ' where id = \''.$adp[0]['id'].'\'';
				$this->executeSql($sql);
				return $adp[0]['id'];
			}
			//////////////////////////////////////////////////////////////////////////////
			// 同代理商、就近都未分配到位置，请手动分配位置
			//////////////////////////////////////////////////////////////////////////////
			return '-3';
		}
		//////////////////////////////////////////////////////////////////////////////
		// 第一次到的新品，查找当前代理商空余量最大的仓位
		//////////////////////////////////////////////////////////////////////////////
		$sql = 'select * from t_sys_ware_position p where p.userId = \''.$storeId.'\' and p.allHeight > 1 and p.wareType = 13 and ifnull(p.divide,"") = \''.$divide.'\' and varietiestype = \''.$product['tid'].'\' order by resvolume desc';
		$adp = new SqlDataProvider([
			'sql' => $sql
		]);
		$adp=$adp->getModels();
		// 剩余位置最大
		if(count($adp) > 0 && $adp[0]['area'] * (1 - $product['marge']) < $adp[0]['resarea'] - $product['volume']){
			// 修改剩余体积
			$sql = 'update t_sys_ware_position set resvolume = resvolume - ' . $product['volume'] . ' where id = \''.$adp[0]['id'].'\'';
			$this->executeSql($sql);
			return $adp[0]['id'];
		}
		//////////////////////////////////////////////////////////////////////////////
		// 代理商仓位存放不下
		//////////////////////////////////////////////////////////////////////////////
		else{
			$condition = array();
			// 循环已存放商品位置，取最近位置
			foreach($adp as $item){
				$condition[] = "'" . $item['wareId'] . "'";
			}
			$sql = 'select * from t_sys_ware_position p where p.userId = \''.$storeId.'\' and p.allHeight > 1 and p.wareType = 13 and varietiestype = \''.$product['tid'].'\' and volume * (1 - '.$product['marge'].') < resvolume - '.$product['volume'].' and wareId in (' . implode(',',$condition) . ') order by resvolume desc';
			$adp = new SqlDataProvider([
				'sql' => $sql
			]);
			$adp=$adp->getModels();
			// 剩余位置最大
			if(count($adp) > 0){
				// 修改剩余面积
				$sql = 'update t_sys_ware_position set resvolume = resvolume - ' . $product['volume'] . ' where id = \''.$adp[0]['id'].'\'';
				$this->executeSql($sql);
				return $adp[0]['id'];
			}
			//////////////////////////////////////////////////////////////////////////////
			// 同代理商、就近都未分配到位置，请手动分配位置
			//////////////////////////////////////////////////////////////////////////////
			return '-3';
		}
	}
	
	/**
	 * 货架单层存放
	 */
	private function getSavePositionDan($product,$divide,$storeId){
		// var_dump('expression');die;
		// 计算占地面积
		if($product['packageleng'] >= $product['packagewidth'] && $product['packageheight'] >= $product['packagewidth']){
			$area = $product['packageleng']/1000 * $product['packageheight']/ 1000;
		}else if($product['packagewidth'] >= $product['packageleng'] && $product['packageheight'] >= $product['packageleng']){
			$area = $product['packagewidth']/1000 * $product['packageheight']/ 1000;
		}else{
			$area = $product['packagewidth']/1000 * $product['packageleng']/ 1000;
		}
		//////////////////////////////////////////////////////////////////////////////
		// 查询当前代理商仓位是否有对应货物
		//////////////////////////////////////////////////////////////////////////////
		$sql = 'select p.* from t_sys_ware_position p left join t_goods_infodetail d on p.id = d.locationid '
			. 'where p.allHeight > 1 and p.wareType = 13 and d.fnumber = \''.$product['fnumber']. '\' and d.sizenumber = \''.$product['sizenumber']. '\' and p.userId = \''.$storeId. '\' and ifnull(p.divide,"") = \''.$divide. '\' ';
			// echo($sql);die;
		$adp = new SqlDataProvider([
			'sql' => $sql
		]);
		$adp=$adp->getModels();
		// var_dump($adp);die;
		// 有对应货物
		if(!empty($adp) && count($adp) != 0){
			//////////////////////////////////////////////////////////////////////////////
			// 循环货物对应仓库
			//////////////////////////////////////////////////////////////////////////////
			foreach($adp as $item){
				// 体积够存放
				if($item['area'] * (1 - $product['marge']) < $item['resarea'] -  $area){
					// 修改剩余体积
					$sql = 'update t_sys_ware_position set resarea = resarea - ' . $area . ' where id = \''.$item['id'].'\'';
					$this->executeSql($sql);
					return $item['id'];
				}
			}
			//////////////////////////////////////////////////////////////////////////////
			// 当前代理商所有位置
			//////////////////////////////////////////////////////////////////////////////
			// 当前代理商所有能存放下该商品的仓位（取剩余面积最大）
			$sql = 'select * from t_sys_ware_position p where p.userId = \''.$storeId.'\' and p.allHeight > 1 and p.wareType = 13 and ifnull(p.divide,"") = \''.$divide.'\' and varietiestype = \''.$product['tid'].'\' and area * (1 - '.$product['marge'].') < resarea - '.$area.' order by resvolume desc';
			$adp = new SqlDataProvider([
				'sql' => $sql
			]);
			$adp=$adp->getModels();
			// 剩余位置最大
			if(count($adp) > 0){
				// 修改剩余体积
				$sql = 'update t_sys_ware_position set resarea = resarea - ' . $area . ' where id = \''.$adp[0]['id'].'\'';
				$this->executeSql($sql);
				return $adp[0]['id'];
			}
			//////////////////////////////////////////////////////////////////////////////
			// 就近
			//////////////////////////////////////////////////////////////////////////////
			$condition = array();
			// 循环已存放商品位置，取最近位置
			foreach($adp as $item){
				$condition[] = "'" . $item['wareId'] . "'";
			}
			$sql = 'select * from t_sys_ware_position p where p.userId = \''.$storeId.'\' and p.allHeight > 1 and p.wareType = 13 and varietiestype = \''.$product['tid'].'\' and area * (1 - '.$product['marge'].') < resarea - '.$area.' and wareId in (' . implode(',',$condition) . ') order by resarea desc';
			$adp = new SqlDataProvider([
				'sql' => $sql
			]);
			$adp=$adp->getModels();
			// 剩余位置最大
			if(count($adp) > 0){
				// 修改剩余体积
				$sql = 'update t_sys_ware_position set resarea = resarea - ' . $area . ' where id = \''.$adp[0]['id'].'\'';
				$this->executeSql($sql);
				return $adp[0]['id'];
			}
			//////////////////////////////////////////////////////////////////////////////
			// 同代理商、就近都未分配到位置，请手动分配位置
			//////////////////////////////////////////////////////////////////////////////
			return '-3';
		}
		//////////////////////////////////////////////////////////////////////////////
		// 第一次到的新品，查找当前代理商空余量最大的仓位
		//////////////////////////////////////////////////////////////////////////////
		$sql = 'select * from t_sys_ware_position p where p.userId = \''.$storeId.'\' and p.allHeight > 1 and p.wareType = 13 and ifnull(p.divide,"") = \''.$divide.'\' and varietiestype = \''.$product['tid'].'\' order by resarea desc';
		$adp = new SqlDataProvider([
			'sql' => $sql
		]);
		$adp=$adp->getModels();
		// var_dump($adp);die;
		// 剩余位置最大
		if(count($adp) > 0 && $adp[0]['area'] * (1 - $product['marge']) < $adp[0]['resarea'] - $area){
			// 修改剩余体积
			$sql = 'update t_sys_ware_position set resarea = resarea - ' . $area . ' where id = \''.$adp[0]['id'].'\'';
			$this->executeSql($sql);
			return $adp[0]['id'];
		}
		//////////////////////////////////////////////////////////////////////////////
		// 代理商仓位存放不下
		//////////////////////////////////////////////////////////////////////////////
		else{
			$condition = array();
			// 循环已存放商品位置，取最近位置
			foreach($adp as $item){
				$condition[] = "'" . $item['wareId'] . "'";
			}
			$sql = 'select * from t_sys_ware_position p where p.userId = \''.$storeId.'\' and p.allHeight > 1 and p.wareType = 13 and varietiestype = \''.$product['tid'].'\' and area * (1 - '.$product['marge'].') < resarea - '.$area.' and wareId in (' . implode(',',$condition) . ') order by resarea desc';
			$adp = new SqlDataProvider([
				'sql' => $sql
			]);
			$adp=$adp->getModels();
			
			// 剩余位置最大
			if(count($adp) > 0){
				// 修改剩余面积
				$sql = 'update t_sys_ware_position resarea = resarea - ' . $area . ' where id = \''.$adp[0]['id'].'\'';
				$this->executeSql($sql);
				return $adp[0]['id'];
			}
			//////////////////////////////////////////////////////////////////////////////
			// 同代理商、就近都未分配到位置，请手动分配位置
			//////////////////////////////////////////////////////////////////////////////
			return '-3';
		}
	}
	
	/**
	 * 无货架回型堆叠
	 */
	private function getSavePositionWuHui($product,$divide,$storeId){
		// 计算占地面积
		if($product['packageleng'] >= $product['packagewidth'] && $product['packageheight'] >= $product['packagewidth']){
			$area = $product['packageleng']/1000 * $product['packageheight']/ 1000;
		}else if($product['packagewidth'] >= $product['packageleng'] && $product['packageheight'] >= $product['packageleng']){
			$area = $product['packagewidth']/1000 * $product['packageheight']/ 1000;
		}else{
			$area = $product['packagewidth']/1000 * $product['packageleng']/ 1000;
		}
		//////////////////////////////////////////////////////////////////////////////
		// 查询当前代理商仓位是否有对应货物
		//////////////////////////////////////////////////////////////////////////////
		$sql = 'select ifnull(t1.cnt,0) + ifnull(t2.cnt,0) as count,t1.* from ('
			. 'select p.*,count(*) as cnt from t_sys_ware_position p left join t_goods_infodetail d on p.id = d.locationid '
			. 'where p.allHeight = 1 and p.wareType = 13 and d.fnumber = \''.$product['fnumber']. '\' and d.sizenumber = \''.$product['sizenumber']. '\' and p.userId = \''.$storeId. '\' and ifnull(p.divide,"") = \''.$divide. '\' group by p.id) t1 '
			. 'left join (select locationid,count(*) as cnt from t_location_store where fnumber = \''.$product['fnumber']. '\' and sizenumber = \''.$product['sizenumber']. '\' group by locationid) t2';
		$adp = new SqlDataProvider([
			'sql' => $sql
		]);
		$adp=$adp->getModels();
		// 有对应货物
		if(!empty($adp) && count($adp) != 0){
			//////////////////////////////////////////////////////////////////////////////
			// 循环货物对应仓库
			//////////////////////////////////////////////////////////////////////////////
			foreach($adp as $item){
				// 当前仓位该货物数为奇数
				if($item['count']%2 == 1){
					// 临时表占位
					$this->execInsert('t_location_store',array('fnumber'=>$product['fnumber'],'sizenumber'=>$product['sizenumber'],'dealline'=>$product['dealline'],'goodid'=>$product['goodid'],'locationid'=>$item['id']));
					return $item['id'];
				}
				// 偶数
				else if($item['area'] * (1 - $product['marge']) < $item['resarea'] - $area){
					$sql = 'update t_sys_ware_position set resarea = resarea - ' . $area . ' where id = \''.$item['id'].'\'';
					$this->executeSql($sql);
					// 占位
					$this->execInsert('t_location_store',array('fnumber'=>$product['fnumber'],'sizenumber'=>$product['sizenumber'],'dealline'=>$product['dealline'],'goodid'=>$product['goodid'],'locationid'=>$item['id']));
					return $item['id'];
				}
			}
			//////////////////////////////////////////////////////////////////////////////
			// 当前代理商所有位置
			//////////////////////////////////////////////////////////////////////////////
			// 当前代理商所有能存放下该商品的仓位（取剩余面积最小）
			$sql = 'select * from t_sys_ware_position p where p.userId = \''.$storeId.'\' and p.allHeight = 1 and p.wareType = 13 and ifnull(p.divide,"") = \''.$divide.'\' and varietiestype = \''.$product['tid'].'\' and area * (1 - '.$product['marge'].') < resarea - '.$area.' order by resarea asc';
			$adp = new SqlDataProvider([
				'sql' => $sql
			]);
			$adp=$adp->getModels();
			// 剩余位置最小
			if(count($adp) > 0){
				// 修改剩余面积
				$sql = 'update t_sys_ware_position set resarea = resarea - ' . $area . ' where id = \''.$adp[0]['id'].'\'';
				$this->executeSql($sql);
				// 占位
				$this->execInsert('t_location_store',array('fnumber'=>$product['fnumber'],'sizenumber'=>$product['sizenumber'],'dealline'=>$product['dealline'],'goodid'=>$product['goodid'],'locationid'=>$adp[0]['id']));
				return $adp[0]['id'];
			}
			//////////////////////////////////////////////////////////////////////////////
			// 就近
			//////////////////////////////////////////////////////////////////////////////
			$condition = array();
			// 循环已存放商品位置，取最近位置
			foreach($adp as $item){
				$condition[] = "'" . $item['wareId'] . "'";
			}
			$sql = 'select * from t_sys_ware_position p where p.userId = \''.$storeId.'\' and p.allHeight = 1 and p.wareType = 13 and varietiestype = \''.$product['tid'].'\' and area * (1 - '.$product['marge'].') < resarea - '.$area.' and wareId in (' . implode(',',$condition) . ') order by resarea asc';
			$adp = new SqlDataProvider([
				'sql' => $sql
			]);
			$adp=$adp->getModels();
			// 剩余位置最大
			if(count($adp) > 0){
				// 修改剩余面积
				$sql = 'update t_sys_ware_position set resarea = resarea - ' . $area . ' where id = \''.$adp[0]['id'].'\'';
				$this->executeSql($sql);
				// 占位
				$this->execInsert('t_location_store',array('fnumber'=>$product['fnumber'],'sizenumber'=>$product['sizenumber'],'dealline'=>$product['dealline'],'goodid'=>$product['goodid'],'locationid'=>$adp[0]['id']));
				return $adp[0]['id'];
			}
			//////////////////////////////////////////////////////////////////////////////
			// 同代理商、就近都未分配到位置，请手动分配位置
			//////////////////////////////////////////////////////////////////////////////
			return '-3';
		}
		//////////////////////////////////////////////////////////////////////////////
		// 第一次到的新品，查找当前代理商空余量最大的仓位
		//////////////////////////////////////////////////////////////////////////////
		$sql = 'select * from t_sys_ware_position p where p.userId = \''.$storeId.'\' and p.allHeight = 1 and p.wareType = 13 and ifnull(p.divide,"") = \''.$divide.'\' and varietiestype = \''.$product['tid'].'\' order by resarea asc';
		$adp = new SqlDataProvider([
			'sql' => $sql
		]);
		$adp=$adp->getModels();
		// 剩余位置最小
		if(count($adp) > 0){
			foreach($adp as $item){
				// 能存下
				if($item['area'] * (1 - $product['marge']) < $item['resarea'] - $area){
					// 修改剩余面积
					$sql = 'update t_sys_ware_position set resarea = resarea - ' . $area . ' where id = \''.$item['id'].'\'';
					$this->executeSql($sql);
					// 占位
					$this->execInsert('t_location_store',array('fnumber'=>$product['fnumber'],'sizenumber'=>$product['sizenumber'],'dealline'=>$product['dealline'],'goodid'=>$product['goodid'],'locationid'=>$item['id']));
					return $item['id'];
				}
			}
			
		}
		//////////////////////////////////////////////////////////////////////////////
		// 代理商仓位存放不下
		//////////////////////////////////////////////////////////////////////////////
		$condition = array();
		// 循环已存放商品位置，取最近位置
		foreach($adp as $item){
			$condition[] = "'" . $item['wareId'] . "'";
		}
		$sql = 'select * from t_sys_ware_position p where p.userId = \''.$storeId.'\' and p.allHeight = 1 and p.wareType = 13 and varietiestype = \''.$product['tid'].'\' and area * (1 - '.$product['marge'].') < resarea - '.$area.' and wareId in (' . implode(',',$condition) . ') order by resarea asc';
		$adp = new SqlDataProvider([
			'sql' => $sql
		]);
		$adp=$adp->getModels();
		// 剩余位置最大
		if(count($adp) > 0){
			// 修改剩余面积
			$sql = 'update t_sys_ware_position set resarea = resarea - ' . $area . ' where id = \''.$adp[0]['id'].'\'';
			$this->executeSql($sql);
			// 占位
			$this->execInsert('t_location_store',array('fnumber'=>$product['fnumber'],'sizenumber'=>$product['sizenumber'],'dealline'=>$product['dealline'],'goodid'=>$product['goodid'],'locationid'=>$adp[0]['id']));
			return $adp[0]['id'];
		}
		//////////////////////////////////////////////////////////////////////////////
		// 同代理商、就近都未分配到位置，请手动分配位置
		//////////////////////////////////////////////////////////////////////////////
		return '-3';
	}
	
	/**
	 * 货架规则堆叠
	 */
	private function getSavePositionWuGui($product,$divide,$storeId){
		//////////////////////////////////////////////////////////////////////////////
		// 查询当前代理商仓位是否有对应货物
		//////////////////////////////////////////////////////////////////////////////
		$sql = 'select p.* from t_sys_ware_position p left join t_goods_infodetail d on p.id = d.locationid '
			. 'where p.allHeight = 1 and p.wareType = 13 and d.fnumber = \''.$product['fnumber']. '\' and d.sizenumber = \''.$product['sizenumber']. '\' and p.userId = \''.$storeId. '\' and ifnull(p.divide,"") = \''.$divide. '\' ';
		$adp = new SqlDataProvider([
			'sql' => $sql
		]);
		$adp=$adp->getModels();
		// 有对应货物
		if(!empty($adp) && count($adp) != 0){
			//////////////////////////////////////////////////////////////////////////////
			// 循环货物对应仓库
			//////////////////////////////////////////////////////////////////////////////
			foreach($adp as $item){
				// 体积够存放
				if($item['volume'] * (1 - $product['marge']) < $item['resvolume'] -  $product['volume']){
					// 修改剩余体积
					$sql = 'update t_sys_ware_position set resvolume = resvolume - ' . $product['volume'] . ' where id = \''.$item['id'].'\'';
					$this->executeSql($sql);
					return $item['id'];
				}
			}
			//////////////////////////////////////////////////////////////////////////////
			// 当前代理商所有位置
			//////////////////////////////////////////////////////////////////////////////
			// 当前代理商所有能存放下该商品的仓位（取剩余面积最大）
			$sql = 'select * from t_sys_ware_position p where p.userId = \''.$storeId.'\' and p.allHeight = 1 and p.wareType = 13 and ifnull(p.divide,"") = \''.$divide.'\' and varietiestype = \''.$product['tid'].'\' order by resvolume asc';
			$adp = new SqlDataProvider([
				'sql' => $sql
			]);
			$adp=$adp->getModels();
			// 剩余位置最大
			if(count($adp) > 0){
				foreach($adp as $item){
					if($item['volume'] * (1 - $product['marge'] ) < $item['resvolume'] - $product['volume']){
						// 修改剩余体积
						$sql = 'update t_sys_ware_position set resvolume = resvolume - ' . $product['volume'] . ' where id = \''.$item['id'].'\'';
						$this->executeSql($sql);
						return $item['id'];
					}
				}
			}
			//////////////////////////////////////////////////////////////////////////////
			// 就近
			//////////////////////////////////////////////////////////////////////////////
			$condition = array();
			// 循环已存放商品位置，取最近位置
			foreach($adp as $item){
				$condition[] = "'" . $item['wareId'] . "'";
			}
			$sql = 'select * from t_sys_ware_position p where p.userId = \''.$storeId.'\' and p.allHeight = 1 and p.wareType = 13 and varietiestype = \''.$product['tid'].'\' and volume * (1 - '.$product['marge'].') < resvolume - '.$product['volume'].' and wareId in (' . implode(',',$condition) . ') order by resvolume asc';
			$adp = new SqlDataProvider([
				'sql' => $sql
			]);
			$adp=$adp->getModels();
			// 剩余位置最大
			if(count($adp) > 0){
				// 修改剩余体积
				$sql = 'update t_sys_ware_position set resvolume = resvolume - ' . $product['volume'] . ' where id = \''.$adp[0]['id'].'\'';
				$this->executeSql($sql);
				return $adp[0]['id'];
			}
			//////////////////////////////////////////////////////////////////////////////
			// 同代理商、就近都未分配到位置，请手动分配位置
			//////////////////////////////////////////////////////////////////////////////
			return '-3';
		}
		//////////////////////////////////////////////////////////////////////////////
		// 第一次到的新品，查找当前代理商空余量最小的仓位
		//////////////////////////////////////////////////////////////////////////////
		$sql = 'select * from t_sys_ware_position p where p.userId = \''.$storeId.'\' and p.allHeight = 1 and p.wareType = 13 and ifnull(p.divide,"") = \''.$divide.'\' and varietiestype = \''.$product['tid'].'\' order by resvolume asc';
		$adp = new SqlDataProvider([
			'sql' => $sql
		]);
		$adp=$adp->getModels();
		// 剩余位置最大
		if(count($adp) > 0){
			foreach($adp as $item){
				if($item['volume'] * (1 - $product['marge'] ) < $item['resvolume'] - $product['volume']){
					// 修改剩余体积
					$sql = 'update t_sys_ware_position set resvolume = resvolume - ' . $product['volume'] . ' where id = \''.$item['id'].'\'';
					$this->executeSql($sql);
					return $item['id'];
				}
			}
			
		}
		//////////////////////////////////////////////////////////////////////////////
		// 代理商仓位存放不下
		//////////////////////////////////////////////////////////////////////////////
		$condition = array();
		// 循环已存放商品位置，取最近位置
		foreach($adp as $item){
			$condition[] = "'" . $item['wareId'] . "'";
		}
		$sql = 'select * from t_sys_ware_position p where p.userId = \''.$storeId.'\' and p.allHeight = 1 and p.wareType = 13 and varietiestype = \''.$product['tid'].'\' and volume * (1 - '.$product['marge'].') < resvolume - '.$product['volume'].' and wareId in (' . implode(',',$condition) . ') order by resvolume asc';
		$adp = new SqlDataProvider([
			'sql' => $sql
		]);
		$adp=$adp->getModels();
		// 剩余位置最大
		if(count($adp) > 0){
			foreach($adp as $item){
				if($item['volume'] * (1 - $product['marge'] ) < $item['resvolume'] - $product['volume']){
					// 修改剩余面积
					$sql = 'update t_sys_ware_position set resvolume = resvolume - ' . $product['volume'] . ' where id = \''.$item['id'].'\'';
					$this->executeSql($sql);
					return $item['id'];
				}
			}
		}
		//////////////////////////////////////////////////////////////////////////////
		// 同代理商、就近都未分配到位置，请手动分配位置
		//////////////////////////////////////////////////////////////////////////////
		return '-3';
	}
	
	/**
	 * 货架单层存放
	 */
	private function getSavePositionWuDan($product,$divide,$storeId){
		// 计算占地面积
		if($product['packageleng'] >= $product['packagewidth'] && $product['packageheight'] >= $product['packagewidth']){
			$area = $product['packageleng']/1000 * $product['packageheight']/ 1000;
		}else if($product['packagewidth'] >= $product['packageleng'] && $product['packageheight'] >= $product['packageleng']){
			$area = $product['packagewidth']/1000 * $product['packageheight']/ 1000;
		}else{
			$area = $product['packagewidth']/1000 * $product['packageleng']/ 1000;
		}
		//////////////////////////////////////////////////////////////////////////////
		// 查询当前代理商仓位是否有对应货物
		//////////////////////////////////////////////////////////////////////////////
		$sql = 'select p.* from t_sys_ware_position p left join t_goods_infodetail d on p.id = d.locationid '
			. 'where p.allHeight = 1 and p.wareType = 13 and d.fnumber = \''.$product['fnumber']. '\' and d.sizenumber = \''.$product['sizenumber']. '\' and p.userId = \''.$storeId. '\' and ifnull(p.divide,"") = \''.$divide. '\' ';
		$adp = new SqlDataProvider([
			'sql' => $sql
		]);
		$adp=$adp->getModels();
		// 有对应货物
		if(!empty($adp) && count($adp) != 0){
			//////////////////////////////////////////////////////////////////////////////
			// 循环货物对应仓库
			//////////////////////////////////////////////////////////////////////////////
			foreach($adp as $item){
				// 体积够存放
				if($item['area'] * (1 - $product['marge']) < $item['resarea'] -  $area){
					// 修改剩余体积
					$sql = 'update t_sys_ware_position set resarea = resarea - ' . $area . ' where id = \''.$item['id'].'\'';
					$this->executeSql($sql);
					return $item['id'];
				}
			}
			//////////////////////////////////////////////////////////////////////////////
			// 当前代理商所有位置
			//////////////////////////////////////////////////////////////////////////////
			// 当前代理商所有能存放下该商品的仓位（取剩余面积最大）
			$sql = 'select * from t_sys_ware_position p where p.userId = \''.$storeId.'\' and p.allHeight = 1 and p.wareType = 13 and ifnull(p.divide,"") = \''.$divide.'\' and varietiestype = \''.$product['tid'].'\' order by resvolume asc';
			$adp = new SqlDataProvider([
				'sql' => $sql
			]);
			$adp=$adp->getModels();
			// 剩余位置最小
			if(count($adp) > 0){
				foreach($adp as $item){
					if($item['area'] * (1 - $product['marge']) < $item['resarea'] - $area){
						// 修改剩余体积
						$sql = 'update t_sys_ware_position set resarea = resarea - ' . $area . ' where id = \''.$item['id'].'\'';
						$this->executeSql($sql);
						return $item['id'];
					}
				}
			}
			//////////////////////////////////////////////////////////////////////////////
			// 就近
			//////////////////////////////////////////////////////////////////////////////
			$condition = array();
			// 循环已存放商品位置，取最近位置
			foreach($adp as $item){
				$condition[] = "'" . $item['wareId'] . "'";
			}
			$sql = 'select * from t_sys_ware_position p where p.userId = \''.$storeId.'\' and p.allHeight = 1 and p.wareType = 13 and varietiestype = \''.$product['tid'].'\' and wareId in (' . implode(',',$condition) . ') order by resarea asc';
			$adp = new SqlDataProvider([
				'sql' => $sql
			]);
			$adp=$adp->getModels();
			// 剩余位置最大
			if(count($adp) > 0){
				foreach($adp as $item){
					if($item['area'] * (1 - $product['marge']) < $item['resarea'] - $area){
						// 修改剩余体积
						$sql = 'update t_sys_ware_position set resarea = resarea - ' . $area . ' where id = \''.$item['id'].'\'';
						$this->executeSql($sql);
						return $item['id'];
					}
				}
			}
			//////////////////////////////////////////////////////////////////////////////
			// 同代理商、就近都未分配到位置，请手动分配位置
			//////////////////////////////////////////////////////////////////////////////
			return '-3';
		}
		//////////////////////////////////////////////////////////////////////////////
		// 第一次到的新品，查找当前代理商空余量最大的仓位
		//////////////////////////////////////////////////////////////////////////////
		$sql = 'select * from t_sys_ware_position p where p.userId = \''.$storeId.'\' and p.allHeight = 1 and p.wareType = 13 and ifnull(p.divide,"") = \''.$divide.'\' and varietiestype = \''.$product['tid'].'\' order by resarea asc';
		$adp = new SqlDataProvider([
			'sql' => $sql
		]);
		$adp=$adp->getModels();
		// 剩余位置最大
		if(count($adp) > 0){
			foreach($adp as $item){
				if($item['area'] * (1 - $product['marge']) < $item['resarea'] - $area){
					// 修改剩余体积
					$sql = 'update t_sys_ware_position set resarea = resarea - ' . $area . ' where id = \''.$item['id'].'\'';
					$this->executeSql($sql);
					return $item['id'];
				}
			}
		}
		//////////////////////////////////////////////////////////////////////////////
		// 代理商仓位存放不下
		//////////////////////////////////////////////////////////////////////////////
		$condition = array();
		// 循环已存放商品位置，取最近位置
		foreach($adp as $item){
			$condition[] = "'" . $item['wareId'] . "'";
		}
		$sql = 'select * from t_sys_ware_position p where p.userId = \''.$storeId.'\' and p.allHeight = 1 and p.wareType = 13 and varietiestype = \''.$product['tid'].'\' and wareId in (' . implode(',',$condition) . ') order by resarea asc';
		$adp = new SqlDataProvider([
			'sql' => $sql
		]);
		$adp=$adp->getModels();
		// 剩余位置最大
		if(count($adp) > 0){
			foreach($adp as $item){
				if($item['area'] * (1 - $product['marge']) < $item['resarea'] - $area){
					// 修改剩余面积
					$sql = 'update t_sys_ware_position resarea = resarea - ' . $area . ' where id = \''.$item['id'].'\'';
					$this->executeSql($sql);
					return $item['id'];
				}
			}
		}
		//////////////////////////////////////////////////////////////////////////////
		// 同代理商、就近都未分配到位置，请手动分配位置
		//////////////////////////////////////////////////////////////////////////////
		return '-3';
	}
	
	
	/**
	 * 小件库
	 */
	private function getSavePositionSmall($product,$divide,$storeId){
		//////////////////////////////////////////////////////////////////////////////
		// 当前代理商是否有分配的小件库
		//////////////////////////////////////////////////////////////////////////////
		$sql = 'select * from t_sys_ware_position where divide = \''.$divide.'\' and wareType = 15 and userId = \''.$storeId.'\' ';
		$adp = new SqlDataProvider([
			'sql' => $sql
		]);
		$adp=$adp->getModels();
		// 当前代理商没有对应类型的仓库
		if(count($adp) == 0){
			return '-4';
		}
		//////////////////////////////////////////////////////////////////////////////
		// 查询当前代理商仓位是否有对应货物
		//////////////////////////////////////////////////////////////////////////////
		$sql = 'select p.* from t_sys_ware_position p left join t_goods_infodetail d on p.id = d.locationid '
			. 'where p. wareType = 15 and d.fnumber = \''.$product['fnumber']. '\' and d.sizenumber = \''.$product['sizenumber']. '\' and p.userId = \''.$storeId. '\' and ifnull(p.divide,"") = \''.$divide. '\' ';
		$adp = new SqlDataProvider([
			'sql' => $sql
		]);
		$adp=$adp->getModels();
		// 有对应货物
		if(!empty($adp) && count($adp) != 0){
			//////////////////////////////////////////////////////////////////////////////
			// 循环货物对应仓库
			//////////////////////////////////////////////////////////////////////////////
			foreach($adp as $item){
				// 体积够存放
				if($item['volume'] * (1 - $product['marge']) < $item['resvolume'] -  $product['volume']){
					// 修改剩余体积
					$sql = 'update t_sys_ware_position set resvolume = resvolume - ' . $product['volume'] . ' where id = \''.$item['id'].'\'';
					$this->executeSql($sql);
					return $item['id'];
				}
			}
			//////////////////////////////////////////////////////////////////////////////
			// 当前代理商所有位置
			//////////////////////////////////////////////////////////////////////////////
			// 当前代理商所有能存放下该商品的仓位（取剩余面积最大）
			$sql = 'select * from t_sys_ware_position p where p.userId = \''.$storeId.'\' and p. wareType = 15 and ifnull(p.divide,"") = \''.$divide.'\' order by resvolume desc';
			$adp = new SqlDataProvider([
				'sql' => $sql
			]);
			$adp=$adp->getModels();
			// 剩余位置最大
			if(count($adp) > 0){
				foreach($adp as $item){
					if($item['volume'] * (1 - $product['marge']) < $item['resvolume'] - $product['volume']){
						// 修改剩余体积
						$sql = 'update t_sys_ware_position set resvolume = resvolume - ' . $product['volume'] . ' where id = \''.$item['id'].'\'';
						$this->executeSql($sql);
						return $item['id'];
					}
				}
			}
			//////////////////////////////////////////////////////////////////////////////
			// 就近
			//////////////////////////////////////////////////////////////////////////////
			$condition = array();
			// 循环已存放商品位置，取最近位置
			foreach($adp as $item){
				$condition[] = "'" . $item['wareId'] . "'";
			}
			$sql = 'select * from t_sys_ware_position p where p.userId = \''.$storeId.'\' and p. wareType = 15 and volume * (1 - '.$product['marge'].') < resvolume - '.$product['volume'].' and wareId in (' . implode(',',$condition) . ') order by resvolume desc';
			$adp = new SqlDataProvider([
				'sql' => $sql
			]);
			$adp=$adp->getModels();
			// 剩余位置最大
			if(count($adp) > 0){
				// 修改剩余体积
				$sql = 'update t_sys_ware_position set resvolume = resvolume - ' . $product['volume'] . ' where id = \''.$adp[0]['id'].'\'';
				$this->executeSql($sql);
				return $adp[0]['id'];
			}
			//////////////////////////////////////////////////////////////////////////////
			// 同代理商、就近都未分配到位置，请手动分配位置
			//////////////////////////////////////////////////////////////////////////////
			return '-3';
		}
		//////////////////////////////////////////////////////////////////////////////
		// 第一次到的新品，查找当前代理商空余量最大的仓位
		//////////////////////////////////////////////////////////////////////////////
		$sql = 'select * from t_sys_ware_position p where p.userId = \''.$storeId.'\' and p. wareType = 15 and ifnull(p.divide,"") = \''.$divide.'\' order by resvolume desc';
		$adp = new SqlDataProvider([
			'sql' => $sql
		]);
		$adp=$adp->getModels();
		// 剩余位置最大
		if(count($adp) > 0 && $adp[0]['area'] * (1 - $product['marge']) < $adp[0]['resarea'] - $product['volume']){
			// 修改剩余体积
			$sql = 'update t_sys_ware_position set resvolume = resvolume - ' . $product['volume'] . ' where id = \''.$adp[0]['id'].'\'';
			$this->executeSql($sql);
			return $adp[0]['id'];
		}
		//////////////////////////////////////////////////////////////////////////////
		// 代理商仓位存放不下
		//////////////////////////////////////////////////////////////////////////////
		else{
			$condition = array();
			// 循环已存放商品位置，取最近位置
			foreach($adp as $item){
				$condition[] = "'" . $item['wareId'] . "'";
			}
			$sql = 'select * from t_sys_ware_position p where p.userId = \''.$storeId.'\' and p. wareType = 15 and volume * (1 - '.$product['marge'].') < resvolume - '.$product['volume'].' and wareId in (' . implode(',',$condition) . ') order by resvolume desc';
			$adp = new SqlDataProvider([
				'sql' => $sql
			]);
			$adp=$adp->getModels();
			// 剩余位置最大
			if(count($adp) > 0){
				// 修改剩余面积
				$sql = 'update t_sys_ware_position set resvolume = resvolume - ' . $product['volume'] . ' where id = \''.$adp[0]['id'].'\'';
				$this->executeSql($sql);
				return $adp[0]['id'];
			}
			//////////////////////////////////////////////////////////////////////////////
			// 同代理商、就近都未分配到位置，请手动分配位置
			//////////////////////////////////////////////////////////////////////////////
			return '-3';
		}
	}
}

?>
